xenpm: Set scheduler vcpu_migration_delay by xenpm
authorKeir Fraser <keir.fraser@citrix.com>
Mon, 6 Apr 2009 12:49:16 +0000 (13:49 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Mon, 6 Apr 2009 12:49:16 +0000 (13:49 +0100)
Signed-off-by: Yu Ke <ke.yu@intel.com>
Signed-off-by: Yang Xiaowei <xiaowei.yang@intel.com>
tools/libxc/xc_pm.c
tools/libxc/xenctrl.h
tools/misc/xenpm.c
xen/common/sched_credit.c
xen/common/sysctl.c
xen/drivers/acpi/pmstat.c
xen/include/public/sysctl.h
xen/include/xen/sched.h
xen/include/xsm/xsm.h
xen/xsm/dummy.c

index 652f1729efe6141cc74ea014b02b1eb3d7b7555d..501041073e157e6159e23110ff51e6e6f311fbf4 100644 (file)
@@ -362,6 +362,36 @@ int xc_set_sched_opt_smt(int xc_handle, uint32_t value)
    return rc;
 }
 
+int xc_set_vcpu_migration_delay(int xc_handle, uint32_t value)
+{
+   int rc;
+   DECLARE_SYSCTL;
+
+   sysctl.cmd = XEN_SYSCTL_pm_op;
+   sysctl.u.pm_op.cmd = XEN_SYSCTL_pm_op_set_vcpu_migration_delay;
+   sysctl.u.pm_op.cpuid = 0;
+   sysctl.u.pm_op.set_vcpu_migration_delay = value;
+   rc = do_sysctl(xc_handle, &sysctl);
+
+   return rc;
+}
+
+int xc_get_vcpu_migration_delay(int xc_handle, uint32_t *value)
+{
+   int rc;
+   DECLARE_SYSCTL;
+
+   sysctl.cmd = XEN_SYSCTL_pm_op;
+   sysctl.u.pm_op.cmd = XEN_SYSCTL_pm_op_get_vcpu_migration_delay;
+   sysctl.u.pm_op.cpuid = 0;
+   rc = do_sysctl(xc_handle, &sysctl);
+
+   if (!rc && value)
+       *value = sysctl.u.pm_op.get_vcpu_migration_delay;
+
+   return rc;
+}
+
 int xc_get_cpuidle_max_cstate(int xc_handle, uint32_t *value)
 {
     int rc;
index 7111fa97c576f62d351b47e5fd725e082491664e..c9b1866b600c3b6c2b5044e7555e492551f9340e 100644 (file)
@@ -1261,6 +1261,8 @@ struct xc_get_cputopo {
 int xc_get_cputopo(int xc_handle, struct xc_get_cputopo *info);
 
 int xc_set_sched_opt_smt(int xc_handle, uint32_t value);
+int xc_set_vcpu_migration_delay(int xc_handle, uint32_t value);
+int xc_get_vcpu_migration_delay(int xc_handle, uint32_t *value);
 
 int xc_get_cpuidle_max_cstate(int xc_handle, uint32_t *value);
 int xc_set_cpuidle_max_cstate(int xc_handle, uint32_t value);
index 1d6539370655bdfb388b28a25d3759bb520c955f..015d80a5b9dcf6c005ecece5b9199657b2f5f1c5 100644 (file)
@@ -57,6 +57,8 @@ void show_help(void)
             "                                     it is used in ondemand governor.\n"
             " get-cpu-topology                    get thread/core/socket topology info\n"
             " set-sched-smt           enable|disable enable/disable scheduler smt power saving\n"
+            " set-vcpu-migration-delay      <num> set scheduler vcpu migration delay in us\n"
+            " get-vcpu-migration-delay            get scheduler vcpu migration delay\n"
             " set-max-cstate        <num>         set the C-State limitation (<num> >= 0)\n"
             " start [seconds]                     start collect Cx/Px statistics,\n"
             "                                     output after CTRL-C or SIGINT or several seconds.\n"
@@ -884,6 +886,54 @@ void set_sched_smt_func(int argc, char *argv[])
     return;
 }
 
+void set_vcpu_migration_delay_func(int argc, char *argv[])
+{
+    int value;
+    int rc;
+
+    if (argc != 1){
+        show_help();
+        exit(-1);
+    }
+
+    value = atoi(argv[0]);
+
+    if (value < 0)
+    {
+        printf("Please try non-negative vcpu migration delay\n");
+        exit(-1);
+    }
+
+    rc = xc_set_vcpu_migration_delay(xc_fd, value);
+    printf("%s to set vcpu migration delay to %d us\n",
+                    rc? "Fail":"Succeed", value );
+
+    return;
+}
+
+void get_vcpu_migration_delay_func(int argc, char *argv[])
+{
+    uint32_t value;
+    int rc;
+
+    if (argc != 0){
+        show_help();
+        exit(-1);
+    }
+
+    rc = xc_get_vcpu_migration_delay(xc_fd, &value);
+    if (!rc)
+    {
+        printf("Schduler vcpu migration delay is %d us\n", value);
+    }
+    else
+    {
+        printf("Failed to get scheduler vcpu migration delay, errno=%d\n", errno);
+    }
+
+    return;
+}
+
 void set_max_cstate_func(int argc, char *argv[])
 {
     int value, rc;
@@ -918,6 +968,8 @@ struct {
     { "set-up-threshold", scaling_up_threshold_func },
     { "get-cpu-topology", cpu_topology_func},
     { "set-sched-smt", set_sched_smt_func},
+    { "get-vcpu-migration-delay", get_vcpu_migration_delay_func},
+    { "set-vcpu-migration-delay", set_vcpu_migration_delay_func},
     { "set-max-cstate", set_max_cstate_func},
 };
 
index 67ff04647f9e11991629cea8b35181d51fb2eedb..d0d31d9fff17ba06d79761421f3a6ae7c3be8672 100644 (file)
@@ -326,6 +326,16 @@ __csched_vcpu_check(struct vcpu *vc)
 static unsigned int vcpu_migration_delay;
 integer_param("vcpu_migration_delay", vcpu_migration_delay);
 
+void set_vcpu_migration_delay(unsigned int delay)
+{
+    vcpu_migration_delay = delay;
+}
+
+unsigned int get_vcpu_migration_delay(void)
+{
+    return vcpu_migration_delay;
+}
+
 static inline int
 __csched_vcpu_is_cache_hot(struct vcpu *v)
 {
index 70da6264165da870f1efe9dbb7e89cc5e7e61499..fe254bbbbd170fc151a8e84d959caa475c1ea84a 100644 (file)
@@ -206,6 +206,10 @@ long do_sysctl(XEN_GUEST_HANDLE(xen_sysctl_t) u_sysctl)
 
     case XEN_SYSCTL_get_pmstat:
     {
+        ret = xsm_get_pmstat();
+        if ( ret )
+            break;
+
         ret = do_get_pm_info(&op->u.get_pmstat);
         if ( ret )
             break;
@@ -220,6 +224,10 @@ long do_sysctl(XEN_GUEST_HANDLE(xen_sysctl_t) u_sysctl)
 
     case XEN_SYSCTL_pm_op:
     {
+        ret = xsm_pm_op();
+        if ( ret )
+            break;
+
         ret = do_pm_op(&op->u.pm_op);
         if ( ret && (ret != -EAGAIN) )
             break;
index 33954307d7de197ff3bcb40765422a8052f7c374..ad3623d5f2ad6859ea0bf303ed807b940a32dd82 100644 (file)
@@ -528,6 +528,18 @@ int do_pm_op(struct xen_sysctl_pm_op *op)
         break;
     }
 
+    case XEN_SYSCTL_pm_op_set_vcpu_migration_delay:
+    {
+        set_vcpu_migration_delay(op->set_vcpu_migration_delay);
+        break;
+    }
+
+    case XEN_SYSCTL_pm_op_get_vcpu_migration_delay:
+    {
+        op->get_vcpu_migration_delay = get_vcpu_migration_delay();
+        break;
+    }
+
     case XEN_SYSCTL_pm_op_get_max_cstate:
     {
         op->get_max_cstate = acpi_get_cstate_limit();
index cb03262bd2bc8ab8aec42e3428cb95c29957a8e3..f17cd45072e223a97326dd7c3b269985da0538dc 100644 (file)
@@ -386,6 +386,10 @@ struct xen_sysctl_pm_op {
     #define XEN_SYSCTL_pm_op_get_max_cstate       0x22
     #define XEN_SYSCTL_pm_op_set_max_cstate       0x23
 
+    /* set scheduler migration cost value */
+    #define XEN_SYSCTL_pm_op_set_vcpu_migration_delay   0x24
+    #define XEN_SYSCTL_pm_op_get_vcpu_migration_delay   0x25
+
     uint32_t cmd;
     uint32_t cpuid;
     union {
@@ -397,6 +401,8 @@ struct xen_sysctl_pm_op {
         uint32_t                    set_sched_opt_smt;
         uint32_t                    get_max_cstate;
         uint32_t                    set_max_cstate;
+        uint32_t                    get_vcpu_migration_delay;
+        uint32_t                    set_vcpu_migration_delay;
     };
 };
 
index 206bf6de4e6edabfa5b8070301ed95230533dc20..46731a5e980893d26d64db062ed29751785e3537 100644 (file)
@@ -552,6 +552,9 @@ uint64_t get_cpu_idle_time(unsigned int cpu);
 #define is_hvm_vcpu(v)   (is_hvm_domain(v->domain))
 #define need_iommu(d)    ((d)->need_iommu && !(d)->is_hvm)
 
+void set_vcpu_migration_delay(unsigned int delay);
+unsigned int get_vcpu_migration_delay(void);
+
 extern int sched_smt_power_savings;
 
 extern enum cpufreq_controller {
index e5e15d53420bd16373fc3024d17a1488ba63068c..6d45efd0e2bf90d0ba5628385da6071b08e7e0ba 100644 (file)
@@ -75,6 +75,8 @@ struct xsm_operations {
     int (*debug_keys) (void);
     int (*getcpuinfo) (void);
     int (*availheap) (void);
+    int (*get_pmstat) (void);
+    int (*pm_op) (void);
 
     int (*evtchn_unbound) (struct domain *d, struct evtchn *chn, domid_t id2);
     int (*evtchn_interdomain) (struct domain *d1, struct evtchn *chn1,
@@ -282,6 +284,16 @@ static inline int xsm_getcpuinfo (void)
     return xsm_call(getcpuinfo());
 }
 
+static inline int xsm_get_pmstat(void)
+{
+    return xsm_call(get_pmstat());
+}
+
+static inline int xsm_pm_op(void)
+{
+    return xsm_call(pm_op());
+}
+
 static inline int xsm_evtchn_unbound (struct domain *d1, struct evtchn *chn,
                                                                     domid_t id2)
 {
index 8809828b7f91f9f9e23a9e2391bf38a440921c94..b6ac73a14740d8850c016ed9264a0e55d57c6870 100644 (file)
@@ -134,6 +134,16 @@ static int dummy_getcpuinfo (void)
     return 0;
 }
 
+static int dummy_get_pmstat (void)
+{
+    return 0;
+}
+
+static int dummy_pm_op (void)
+{
+    return 0;
+}
+
 static int dummy_availheap (void)
 {
     return 0;